<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

Loader::using("models::entities::enums::Sector");
Loader::using("models::entities::enums::Naturaleza");
Loader::using("models::entities::enums::NivelesIdiomas");
Loader::using("models::entities::enums::NivelPosgrado");
Loader::using("models::entities::enums::EstadoCivil");
Loader::using("models::entities::enums::GrupoSanguineo");
Loader::using("models::entities::PlanesEstudios");
Loader::using("ext::libs::MicrosoftDateFormatter");
Loader::using("models::cities");

/**
 * Description of ActualizarDatos
 *
 * @author ETorres
 * @export Modules
 */
class ActualizarDatos extends Module {

    /**
     *
     * @var Estudiantes
     */
    private $student;

    public function index() {
        if ($this->request->submitted()) {
            $_SESSION['Username'] = $this->request->post("Username");
            
            $this->loadStudent();
            
            if ($this->student->getDatosMadre() == NULL) {
                $this->student->setDatosMadre(new Personas());
            }
            if ($this->student->getDatosPadre() == null) {
                $this->student->setDatosPadre(new Personas());
            }
            if ($this->student->getDatosCorreo() == null) {
                $this->student->setDatosCorreo(new DatosContacto());
            }

            if ($this->student->getDatosCorreo()->getMunicipio() != null) {
                $Nombre = $this->student->getDatosCorreo()->getMunicipio()->getNombre();
                $Municipio = new Municipios();

                // secho $Nombre;
                $Municipio = $this->model->cities->GetByNombre($Nombre);
                $Municipio = $Municipio[0];

                $this->student->getDatosCorreo()->setMunicipio($Municipio);
            }

            $this->assign("complementaryData", $this->model->complementaryData->getDatosComplementariosByCodigoEstudiante($this->student->getCodigoEstudiante()));
            $this->assign("action", $this->route->action("Update"));

            $this->ShowHijos();
            $this->loadPersonalData();
            $this->loadEmploymentData();
            $this->loadLanguagesData();
            $this->loadAcademicData();
            $this->loadReconocimientos();
            
            $this->addMessage(new Message("¡Bienvenid@!", "", Message::SUCCESS));

            $this->display("index");
        } else {
            $this->route->redirect($this->route->moduleAction("Login"));
        }
    }
    
    private function loadStudent(){
        $this->student = $this->model->students->GetByDocumentoIdentidad($_SESSION['Username']);
        $this->student = $this->student[0];
    }

    public function Update() {
        if ($this->request->submitted()) {
            $this->student = $this->model->students->GetById($this->request->post("codigoEstudiante"));

            if (!$this->student->getTipoSangre()) {
                $this->student->setTipoSangre(new TipoSangre());
            }
            if (!$this->student->getLugarNacimiento()) {
                $this->student->setLugarNacimiento(new Municipios());
            }
            if (!$this->student->getConyugue()) {
                $this->student->setConyugue(new Personas());
            }

            if (!$this->student->getDatosPadre()) {
                $this->student->setDatosPadre(new Personas());
                $this->student->getDatosPadre()->setDatosLaborales(new DatosLaboral());
            }

            if (!$this->student->getDatosMadre()) {
                $this->student->setDatosMadre(new Personas());
                $this->student->getDatosMadre()->setDatosLaborales(new DatosLaboral());
            }
            
            if(!$this->student->getDatosCorreo()){
                $this->student->setDatosCorreo(new DatosContacto());
            }


            $this->request->bind($this->student);

            $complementarios = $this->request->post("Complementarios");

            if (count($complementarios) > 0) {
                if (array_key_exists("tiempoPrimerEmpleo", $complementarios) && empty($complementarios["tiempoPrimerEmpleo"])) {
                    $complementarios["tiempoPrimerEmpleo"] = null;
                    $complementarios["tipoTiempoPrimerEmpleo"] = null;
                }

                $this->model->complementaryData->guardarDatosComplementarios($this->student->getCodigoEstudiante(), $complementarios);
            }

            $response = $this->model->students->Update($this->student);

            $this->addMessage(new Message("Sus datos personales han sido actualizados.", "", Message::SUCCESS));
            
            $this->display();
        } else {
            $this->index();
        }
    }

    public function AddInformacionLaboral() {
        Loader::using("models::entities::HistorialLaboral");
        $this->loadStudent();

        $InformacionLaboral = new HistorialLaboral();

        $InformacionLaboralPk = new HistorialLaboralPk();
        $InformacionLaboralPk->setCodigoInterno($this->request->get("CodigoInterno"));
        $InformacionLaboralPk->setSecuencia(0);

        $InformacionLaboral->setHistorialLaboralPk($InformacionLaboralPk);
        $this->modifyInformacionLaboral($InformacionLaboral);

        echo $this->model->employment->Create($InformacionLaboral);

        $this->ShowInformacionLaboral();
    }

    public function EditInformacionLaboral() {
        $this->loadStudent();
        $InformacionLaboralPk = $this->retrieveHistorialLaboralPK();
        $InformacionLaboral = $this->model->employment->GetById($InformacionLaboralPk);

        $this->modifyInformacionLaboral($InformacionLaboral);

        echo $this->model->employment->Update($InformacionLaboral);

        $this->ShowInformacionLaboral();
    }

    public function DeleteInformacionLaboral() {
        $this->loadStudent();
        $InformacionLaboralPk = $this->retrieveHistorialLaboralPK();
        $this->model->employment->Delete($InformacionLaboralPk);
        $this->ShowInformacionLaboral();
    }

    public function AddInformacionAcademica() {
        $this->loadStudent();
        Loader::using("models::entities::HistorialAcademico");
        $InformacionAcademica = new HistorialAcademico();

        $this->modifyInformacionAcademica($InformacionAcademica);

        echo $this->model->academicHistory->Create($InformacionAcademica);
        $this->ShowInformacionAcademica();
    }

    public function DeleteInformacionAcademica() {
        $this->loadStudent();
        $InformacionAcademicoPk = $this->retrieveHistorialAcademicoPK();
        echo $this->model->academicHistory->Delete($InformacionAcademicoPk);
        $this->ShowInformacionAcademica();
    }

    public function AddInformacionIdiomas() {
        $this->loadStudent();
        if ($this->request->submitted()) {
            Loader::using("models::entities::ManejoIdiomas");
            $data = $this->request->post("HistorialIdiomas");

            $manejoIdiomas = new ManejoIdiomas();

            $manejoIdiomasPK = new ManejoIdiomasPk();
            $manejoIdiomasPK->setCodigoInterno($data["CodigoInterno"]);
            $manejoIdiomasPK->setCodigoIdioma($data["Codigo"]);
            $manejoIdiomas->setManejoIdiomasPk($manejoIdiomasPK);

            $idioma = new Idiomas();
            $idioma->setCodigoIdioma($data["Codigo"]);
            $manejoIdiomas->setIdioma($idioma);

            $this->ModifyIdiomas($manejoIdiomas);

            echo $this->model->languages->addLanguageSkill($manejoIdiomas);
        }
        $this->ShowInformacionIdiomas();
    }

    public function EditInformacionIdiomas() {
        $this->loadStudent();

        $manejoIdiomas = $this->model->languages->getLanguageSkill($this->retrieveHistorialIdiomasPK());

        $this->ModifyIdiomas($manejoIdiomas);

        $this->model->languages->updateLanguageSkill($manejoIdiomas);
        $this->ShowInformacionIdiomas();
    }

    public function DeleteInformacionIdiomas() {
        $this->loadStudent();
        $menejoIdiomasPk = $this->retrieveHistorialIdiomasPK();
        $this->model->languages->deleteLanguageSkill($menejoIdiomasPk);
        $this->ShowInformacionIdiomas();
    }

    //<editor-fold defaultstate="expanded" desc="Helper functions...">

    private function ShowInformacionAcademica() {
        $this->student = $this->model->students->GetById($this->student->getCodigoEstudiante());
        $this->loadAcademicData();

        $this->display("InformacionAcademica");
    }

    private function ShowInformacionLaboral() {
        $this->student = $this->model->students->GetById($this->student->getCodigoEstudiante());

        $this->loadEmploymentData();

        $this->display("InformacionLaboral");
    }

    public function ShowInformacionIdiomas() {
        $this->student = $this->model->students->GetById($this->student->getCodigoEstudiante());

        $this->loadLanguagesData();

        $this->display("InformacionIdiomas");
    }

    private function retrieveHistorialLaboralPK() {
        Loader::using("models::entities::HistorialLaboralPk");
        $InformacionLaboralPk = new HistorialLaboralPk();
        $InformacionLaboralPk->setCodigoInterno($this->request->get("CodigoInterno"));
        $InformacionLaboralPk->setSecuencia($this->request->get("Secuencia"));

        return $InformacionLaboralPk;
    }

    private function modifyInformacionLaboral(HistorialLaboral &$InformacionLaboral) {


        $historialEmpresa = $this->request->post("HistorialEmpresa");

        $InformacionLaboral->setOcupacion($historialEmpresa["Ocupacion"]);
        $InformacionLaboral->setFechaIngreso(MicrosoftDateFormatter::toJSON($historialEmpresa["FechaIngreso"], "d/m/Y"));
        $InformacionLaboral->setNaturaleza($historialEmpresa["Naturaleza"]);
        $InformacionLaboral->setSector($historialEmpresa["Sector"]);
        $InformacionLaboral->setSalario($historialEmpresa["Salario"]);

        $DatosLaboral = new DatosLaboral();
        $DatosLaboral->setNombreEmpresa($historialEmpresa["Nombre"]);

        $DatosContacto = new DatosContacto();
        $DatosContacto->setDireccion($historialEmpresa["Direccion"]);
        $DatosContacto->setTelefono($historialEmpresa["Telefono"]);
        $DatosContacto->getMunicipio()->setNombre($historialEmpresa["Ciudad"]);
        $DatosLaboral->setDatosEmpresa($DatosContacto);

        $InformacionLaboral->setDatosLaboral($DatosLaboral);

        $InformacionLaboral->setCodigoPais($historialEmpresa["Pais"]);
    }

    public function DeleteHijo() {
        $this->loadStudent();
        $hijo = $this->retrieveHijosPk();

        $this->model->children->delete($hijo);

        $this->model->ChildrenComplementaryData->deleteDatosComplementariosHijos($this->request->get("CodigoInterno"), MicrosoftDateFormatter::fromJSON($this->request->get("FechaNacimiento"), "d/m/Y"), $this->request->get("Nombre"), $this->request->get("estudiaraEnUSB"), $this->request->get("posibleCarrera"));

        $this->ShowHijos();
    }

    private function retrieveHijosPk() {

        Loader::using("models::entities::HijosPk");

        $InformacionHijoPk = new HijosPk();
        $InformacionHijoPk->setCodigoInterno($this->request->get("CodigoInterno"));
        $InformacionHijoPk->setFechaNacimiento($this->request->get("FechaNacimiento"));
        $InformacionHijoPk->setNombre($this->request->get("Nombre"));

        return $InformacionHijoPk;
    }

    public function AddHijo() {
        Loader::using("models::entities::Hijos");
        $this->loadStudent();
        if ($this->request->submitted()) {
            $data = $this->request->post("Hijo");

            $hijo = new Hijos();

            $hijoPk = new HijosPk();
            $hijoPk->setCodigoInterno($data["CodigoInterno"]);
            $hijoPk->setNombre($data["Nombre"]);
            $fecha = MicrosoftDateFormatter::toJSON($data["FechaNacimiento"]);
            $hijoPk->setFechaNacimiento($fecha);

            $hijo->setHijoPk($hijoPk);

            $this->model->ChildrenComplementaryData->guardar($data, $hijoPk->getFechaNacimiento());

            $this->model->children->add($hijo);
        }

        $this->ShowHijos();
    }

    public function ShowHijos() {
        $this->student = $this->model->students->GetById($this->student->getCodigoEstudiante());

        $this->loadHijos();

        $this->display("Hijos");
    }

    private function loadHijos() {
        Loader::using("models::entities::Hijos");

        $hijos = array();

        foreach ($this->student->getHijos() as $hijo) {
            $comp = $this->model->ChildrenComplementaryData->getDatosComplementariosHijos($this->student->getCodigoInterno(), MicrosoftDateFormatter::fromJSON($hijo->getHijoPk()->getFechaNacimiento(), "d/m/Y"), $hijo->getHijoPk()->getNombre());
            if ($comp["posibleCarrera"] != NULL) {
                $codigoPlan = $comp["posibleCarrera"];
                $plan = $this->model->career->GetById($comp["posibleCarrera"]);
                $comp["posibleCarrera"] = $plan->getNombrePlan();
                array_push($comp, $codigoPlan);
            }
            array_push($hijos, $comp);
        }

        $PlanesEstudios = $this->model->career->GetByTipoPrograma(PlanesEstudios::PREGRADO, false);
        $this->assign("CodigoInterno", $this->student->getCodigoInterno());
        $this->assign("careers", $PlanesEstudios);
        $this->assign("student", $this->student);
        $this->assign("hijoOtrosDatos", $hijos);
    }

    public function DeleteReconocimiento() {
        $this->loadStudent();
        $id = $this->request->get("Id");

        $this->model->recognition->delete($id);

        $this->ShowReconocimientos();
    }

    public function AddReconocimiento() {
        $this->loadStudent();
        Loader::using("models::entities::Reconocimientos");

        if ($this->request->submitted()) {
            $data = $this->request->post("Reconocimiento");

            $reconocimiento = new Reconocimientos();

            $reconocimiento->setInstitucion($data["Institucion"]);
            $reconocimiento->setCodigoEstudiante($this->student->getCodigoEstudiante());
            $reconocimiento->setDescripcion($data["Descripcion"]);
            $reconocimiento->setIdReconocimiento(0);

            $this->model->recognition->create($reconocimiento);
        }

        $this->ShowReconocimientos();
    }

    public function EditReconocimiento() {
        $this->loadStudent();
        Loader::using("models::entities::Reconocimientos");
        Loader::using("models::entities::HistorialLaboralPk");

        if ($this->request->submitted()) {
            $data = $this->request->post("Reconocimiento");

            $reconocimiento = new Reconocimientos();

            $reconocimiento->setInstitucion($data["Institucion"]);
            $reconocimiento->setCodigoEstudiante($this->student->getCodigoEstudiante());
            $reconocimiento->setDescripcion($data["Descripcion"]);
            $reconocimiento->setIdReconocimiento($this->request->get("Id"));

            $this->model->recognition->Update($reconocimiento);
        }

        $this->ShowReconocimientos();
    }

    public function ShowReconocimientos() {
        $this->student = $this->model->students->GetById($this->student->getCodigoEstudiante());

        $this->loadReconocimientos();

        $this->display("Reconocimientos");
    }

    private function loadReconocimientos() {
        $this->student = $this->model->students->GetById($this->student->getCodigoEstudiante());

//        $this->assign("historialLaboral", $this->student->getHistorialLaboral());

        $reconocimientos = $this->model->recognition->getByCodigoEstudiante($this->student->getCodigoEstudiante());

        $this->assign("reconocimientos", $reconocimientos);
    }

    private function loadPersonalData() {
        $this->assign("lugarNacimientoIsset", $this->issetLocacion($this->student->getLugarNacimiento()));
        $this->assign("lugarResidenciaIsset", $this->issetLocacion($this->student->getDatosCorreo()->getMunicipio()));
        $this->assign("student", $this->student);
        $this->assign("estadosCiviles", Asociados::$EstadosCiviles);

        $this->assign("estratos", array("1", "2", "3", "4", "5", "6",));
        $this->assign("tiposDeSangre", TipoSangre::$nombresGrupos);
        $this->assign("RHs", array("+", "-"));

        $this->assign("viewLaboral", $this->route->moduleAction("InformacionLaboral", "ShowInformacionLaboral"));
        $this->assign("viewAcademico", $this->route->moduleAction("InformacionAcademica", "ShowInformacionAcademica"));
        $this->assign("viewIdiomas", $this->route->moduleAction("InformacionIdiomas", "ShowInformacionIdiomas"));

        $this->assign("paises", $this->model->countries->GetAll(false));
    }

    private function loadEmploymentData() {

        $sectores = array(
            1 => "Mineria",
            2 => "Petrolera",
            3 => "Automotriz",
            4 => "Construcci&oacute;n",
            5 => "Energ&eacute;tico",
            6 => "Ganaderia",
            7 => "Agricultura",
            8 => "Manufacturera",
            9 => "Turismo",
            10 => "Aerea",
            11 => "Banca",
            12 => "Comunicaciones/Transporte",
            13 => "Educaci&oacute;n",
            14 => "Salud",
        );

        $rangosSalariales = array(
            0 => "Menos de 1'000.000",
            1 => "Entre 1'000.000 y 1'500.000",
            2 => "Entre 1'500.000 y 2'000.000",
            3 => "Entre 2'000.000 y 2'500.000",
            4 => "Entre 2'500.000 y 3'000.000",
            5 => "Entre 3'000.000 y 3'500.000",
            6 => "Entre 3'500.000 y 4'000.000",
            7 => "Entre 4'000.000 y 4'500.000",
            8 => "M&aacute;s de 4'500.000",
        );

        $this->assign("CodigoInterno", $this->student->getCodigoInterno());
        $this->assign("historialLaboral", $this->student->getHistorialLaboral());
        $this->assign("sectores", $sectores);
        $this->assign("naturalezas", array_flip(Naturaleza::values()));
        $this->assign("paises", $this->model->countries->GetAll(false));
        $this->assign("rangosSalariales", $rangosSalariales);
    }

    private function loadLanguagesData() {
        $nivelesIdiomas = array_flip(NivelesIdiomas::values());

        $this->assign("addIdiomas", $this->route->action("add", array("ajax" => true)));
        $this->assign("editIdiomas", $this->route->action("edit", array("ajax" => true)));
        $this->assign("deleteIdiomas", $this->route->action("delete", array("ajax" => true)));

        $this->assign("manejoIdiomas", $this->student->getManejoIdiomas());
        $this->assign("nivelesIdiomas", $nivelesIdiomas);
        $this->assign("idiomas", $this->model->languages->GetAll());
        $this->assign("CodigoInterno", $this->student->getCodigoInterno());
    }

    private function loadAcademicData() {
        
        $this->assign("historialAcademico", $this->student->getHistorialAcademico());
        $this->assign("nivelesPosgrado", array_flip(NivelPosgrado::values()));
        $this->assign("CodigoInterno", $this->student->getCodigoInterno());
    }

    private function retrieveHistorialAcademicoPK() {
        Loader::using("models::entities::HistorialAcademicoPk");
        $InformacionAcademicoPk = new HistorialAcademicoPk();
        $InformacionAcademicoPk->setCodigoInterno($this->request->get("CodigoInterno"));
        $InformacionAcademicoPk->setCodigoInstitucion($this->request->get("CodigoInstitucion"));
        $InformacionAcademicoPk->setTitulo($this->request->get("TituloRecibido"));

        return $InformacionAcademicoPk;
    }

    private function modifyInformacionAcademica(HistorialAcademico &$InformacionAcademica) {
        $data = $this->request->post("HistorialAcademico");

        $InformacionAcademicaPk = new HistorialAcademicoPk();
        $InformacionAcademicaPk->setCodigoInterno($data["CodigoInterno"]);
        $InformacionAcademicaPk->setTitulo($data["TituloRecibido"]);

        $InformacionAcademica->setHistorialAcademicoPk($InformacionAcademicaPk);

        $Institucion = new Instituciones();
        $Institucion->setNombreInstitucion($data["Nombre"]);

        $InformacionAcademica->setInstitucion($Institucion);
        $InformacionAcademica->setFechaGrado(MicrosoftDateFormatter::toJSON($data["FechaDeGraduacion"]));
        $InformacionAcademica->setNivelPosgrado($data["NivelPosgrado"]);
    }

    private function retrieveHistorialIdiomasPK() {
        Loader::using("models::entities::ManejoIdiomasPk");
        $manejoIdiomasPK = new ManejoIdiomasPk();
        $manejoIdiomasPK->setCodigoInterno($this->request->get("CodigoInterno"));
        $manejoIdiomasPK->setCodigoIdioma($this->request->get("CodigoIdioma"));

        return $manejoIdiomasPK;
    }

    private function ModifyIdiomas(ManejoIdiomas &$manejoIdiomas) {
        $data = $this->request->post("HistorialIdiomas");
        $manejoIdiomas->setEscribe($data["Escribe"]);
        $manejoIdiomas->setHabla($data["Habla"]);
        $manejoIdiomas->setLee($data["Lee"]);
    }

    /**
     *
     * @param Municipios $loacacion 
     */
    private function issetLocacion($loacacion) {
        $result = false;
        if ($loacacion &&
                $loacacion->getNombre() &&
                $loacacion->getDepartamento() &&
                $loacacion->getDepartamento()->getNombre() &&
                $loacacion->getDepartamento()->getPais() &&
                $loacacion->getDepartamento()->getPais()->getNombre()) {
            $result = true;
        }
        return $result;
    }

    //</editor-fold>
}

?>
